package avicit.bdp.dgs.mdm.service;

import avicit.bdp.common.base.BaseService;
import avicit.bdp.common.utils.BdpLogUtil;
import avicit.bdp.dgs.mdm.dao.MdataChangeDao;
import avicit.bdp.dgs.mdm.dto.MdataChangeDTO;
import avicit.platform6.commons.utils.ComUtil;
import avicit.platform6.commons.utils.PojoUtil;
import avicit.platform6.core.exception.BusinessException;
import avicit.platform6.core.exception.DaoException;
import avicit.platform6.core.properties.PlatformConstant;
import avicit.platform6.core.rest.msg.QueryRespBean;
import avicit.platform6.modules.system.syslog.service.SysLogUtil;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;

/**
 * @金航数码科技有限责任公司
 * @作者：${tableInfo.classCreator}
 * @邮箱：${tableInfo.classMailbox}
 * @创建时间： 2023-12-06 11:02
 * @类说明：
 * @修改记录：
 */
@Service
public class MdataChangeService extends BaseService<MdataChangeDao, MdataChangeDTO> {

    private static final Logger logger = LoggerFactory.getLogger(MdataChangeService.class);

    @Autowired
    private MdataChangeDao mdataChangeDao;
    @Autowired
    private MdataMonitorService mdataMonitorService;

    /**
     * 分页查询
     * @param operType
     * @param pageNo
     * @param pageSize
     * @return
     * @throws Exception
     */
    @Transactional(readOnly = true)
    public QueryRespBean<MdataChangeDTO> getPageList(Integer operType, Integer pageNo, Integer pageSize)
            throws Exception {
        QueryRespBean<MdataChangeDTO> queryRespBean = new QueryRespBean<>();
        PageHelper.startPage(pageNo, pageSize);
        Page<MdataChangeDTO> pageList = mdataChangeDao.getPageList(operType);
        queryRespBean.setResult(pageList);
        BdpLogUtil.log4Query(queryRespBean);
        return queryRespBean;
    }

    /**
     * 新增对象
     *
     * @param dto 保存对象
     * @return String
     */
    @Transactional
    public String save(MdataChangeDTO dto) {
        try {
            dto.setId(ComUtil.getId());
            PojoUtil.setSysProperties(dto, PlatformConstant.OpType.insert);
            this.insert(dto);
            // 记录日志
            SysLogUtil.log4Insert(dto);
            return dto.getId();
        } catch (Exception e) {
            throw new DaoException(e.getMessage(), e);
        }
    }

    /**
     * 修改对象部分字段
     *
     * @param dto 修改对象
     * @return int
     */
    @Transactional
    public int update(MdataChangeDTO dto) {
        try {
            int count = this.updateByPrimaryKey(getUpdateDto(dto));
            if (count == 0) {
                throw new DaoException("数据失效，请重新更新");
            }
            return count;
        } catch (Exception e) {
            throw new DaoException(e.getMessage(), e);
        }
    }

    /**
     * 通过主键查询单条记录
     *
     * @param id 主键id
     */
    @Transactional(readOnly = true)
    public MdataChangeDTO queryById(String id) {
        try {
            MdataChangeDTO dto = this.selectByPrimaryKey(id);
            // 记录日志
            if (dto != null) {
                SysLogUtil.log4Query(dto);
            }
            return dto;
        } catch (Exception e) {
            throw new DaoException(e.getMessage(), e);
        }
    }

    /**
     * 删除
     */
    @Transactional
    public void deleteById(String id){
        if (StringUtils.isEmpty(id)) {
            throw new BusinessException("id不能为空");
        }

        MdataChangeDTO dto = this.selectByPrimaryKey(id);
        if (dto == null) {
            throw new BusinessException(String.format("id=%s的应用不存在", id));
        }
        // 记录日志
        BdpLogUtil.log4Delete(dto);
        // 删除数据
        this.deleteByPrimaryKey(id);
    }

    /**
     * 内部方法，获取修改的dto对象
     *
     * @param dto
     * @return
     */
    private MdataChangeDTO getUpdateDto(MdataChangeDTO dto) {
        MdataChangeDTO oldDTO = this.selectByPrimaryKey(dto.getId());
        if (oldDTO == null) {
            throw new DaoException("数据不存在");
        }
        //记录日志
        SysLogUtil.log4Update(dto, oldDTO);
        PojoUtil.setSysProperties(dto, PlatformConstant.OpType.update);
        PojoUtil.copyProperties(oldDTO, dto, true);
        return oldDTO;
    }

    /**
     * 保存变更的数据
     * @param mdataId    主数据ID
     * @param operType   操作类型，1-新增，2-修改，3-删除
     * @param data       json格式数据详情
     * @return
     */
    @Transactional
    public void saveChangeData(String mdataId, int operType, String data) {
        try {
            MdataChangeDTO dto = new MdataChangeDTO();
            dto.setId(ComUtil.getId());
            dto.setMdataId(mdataId);
            dto.setOperType(operType);
            dto.setOperTime(new Date());
            dto.setData(data);
            PojoUtil.setSysProperties(dto, PlatformConstant.OpType.insert);
            this.insert(dto);

            // 写入监控数据
            mdataMonitorService.saveMonitorData(dto.getId(), mdataId);
        } catch (Exception e) {
            throw new DaoException(e.getMessage(), e);
        }
    }

}
